Ban*_*ble 6 c++ java android android-ndk
我是JNI的新手,我想在将C++ iOS代码移植到它之前弄清楚某些事情是如何工作的.我成功地在Android工作室中获得了一个NDK示例,我可以看到Java如何调用C++函数.
我一直在搜索并获取大量代码,但我无法让它在我的具体实现中工作.
只是为了测试一切是如何工作的,我在java中设置了一个简单的文本日志功能,我试图从我的本机代码中调用它,但我遇到了问题.
这是我的Java函数:
public static void log(String s){
Log.d("Native", s);
}
Run Code Online (Sandbox Code Playgroud)
和C++:
void Log(std::string s){
JNIEnv *env;
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
jstring jstr1 = env->NewStringUTF(s.c_str());
jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");
jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}
Run Code Online (Sandbox Code Playgroud)
从我看到的不同的例子,这应该工作,但它会抛出一个错误:
29835-29849/com.android.gl2jni A/libc? Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 29849 (Thread-17371)
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
编辑:
我已将其更改为GetStaticMethodID.但在记录函数的进度后,我发现失败的行是:
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
Run Code Online (Sandbox Code Playgroud)
我认为这是因为g_JavaVM被设置为static JavaVM* g_JavaVM = NULL;然后再也没有触及过.我猜我需要设置这个变量,但是如何?
我的部分问题是我没有初始化JavaVM.另一部分是我使用C++,但我试图使用C函数.
工作代码是:
Java的:
public static void log(String s){
Log.d("Native", s);
}
Run Code Online (Sandbox Code Playgroud)
C++:
void Log(std::string s){
JNIEnv *env;
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
jstring jstr1 = env->NewStringUTF(s.c_str());
jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");
jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}
//In some initialization function with Environment variable
env->GetJavaVM(&g_JavaVM);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助其他人解决同样的问题.
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
获取静态方法ID
jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
返回类的静态方法的方法 ID。该方法由其名称和签名指定。
| 归档时间: |
|
| 查看次数: |
9317 次 |
| 最近记录: |