【发布时间】:2018-02-07 18:07:27
【问题描述】:
我有一个本地 c++ 库,我想在我的 delphi android 项目中使用它; 这是我想从 Delphi 代码部分调用它的重要部分:
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "EmbJniTest"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
JavaVM* gJavaVM = NULL;
//------------------------------------------------------------------------
jint JNI_OnLoad(JavaVM* aVm, void* aReserved)
{
// cache java VM
gJavaVM = aVm;
JNIEnv* env;// latter on it'll be used as global var
LOGI("JVM INIT");
if (aVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK)
{
LOGI("Failed to get the environment");
return -1;
}
return JNI_VERSION_1_6;
}
这是我加载 mylibrary 的 delphi 代码部分:
LIBNAME = 'libtest.so';
function try_load_dll:integer;
var libPath:system.string;
begin
_status:= 0 ;
libPath:=TPath.Combine(tpath.GetLibraryPath,libname);
_status := LoadLibrary(PChar(libPath));
result:=_Status;
if( _status= 0 )then exit;
end;
问题是
JNI_OnLoad
从未被调用;我在 logcat 中看不到任何关于它的日志。
我读过 JNI_OnLoad 的调用是由 System.loadLibrary() 完成的。如果 你没有使用它来加载库,JNI_OnLoad 不会发生。
来自here 所以请无论如何我可以从我的delphi代码中调用它。
谢谢
【问题讨论】:
-
你可以调用它,但你要为
JavaVM*传递什么? -
@RichardCritten ,稍后我会将 JNIEnv* env 保存为全局变量,以便在我的原生库中的某些过程和函数中使用它
-
只是想知道为什么 JNI_OnLoad 没有被调用,我看不到任何日志
-
@pskink,我没有 java 代码,只有我的原生 Lib 和 Delphi 作为消费者应用程序
-
@RemyLebeau,谢谢,除了在我的 delphi 代码中调用
JNI_OnLoad函数之外,没有其他选择/解决方案了吗?
标签: android c++ delphi android-ndk