Java 代码:
package com.example.maxim.myapplication;
//...
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
}
C 代码:
#include <string.h>
#include <jni.h>
jstring Java_com_example_maxim_myapplication_MainActivity_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI .");
}
LogCat 输出:
Process: com.example.maxim.myapplication, PID: 2306
java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.example.maxim.myapplication.MainActivity.stringFromJNI() (tried Java_com_example_maxim_myapplication_MainActivity_stringFromJNI and Java_com_example_maxim_myapplication_MainActivity_stringFromJNI__)
at com.example.maxim.myapplication.MainActivity.stringFromJNI(Native Method)
....
The package name is same as the name of the function, but there an errorThe package name is same as the function name, but the error
包名与函数名相同,但出现错误最佳答案
你应该像这样在你的共享对象中声明你的本地方法
JNIEXPORT jstring Java_com_example_maxim_myapplication_MainActivity_stringFromJNI (JNIEnv *env, jobject obj)
关键点是 JNIEXPORT
,它指示链接器/编译器公开/导出您的 native 方法
编辑 - 您还想确保确实加载了“正确的”so
(libhello-jni.so)(在这个意义上确实包含 so
你的方法实现,也许你的库路径中某处有一些陈旧的 so
)
在 so
加载时添加 debug logcat
jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
LOGI("In JNI_OnLoad()");
return JNI_VERSION_1_6; // or the version corresponded to your NDK version
}
关于Android NDK 找不到原生函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641912/