摘要:Android NDK(JNI) Tricks
想要來玩玩Android JNI發現網路上的Tutorial都有一些問題
編譯時遇到錯誤:java.lang.UnsatisfiedLinkError: test
發現新版Android NDK已經變成了預設為C++(檔名為:*.cpp)
因此無法用C語言的寫法,必須要改成:
#include
#include
#include "com_example_androidndktesting3_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_androidndktesting3_MainActivity_test(
JNIEnv *env, jobject thiz) {
return env->NewStringUTF((char*)"Hello from My JNI");
}
- <string.h>一定要include,因jstring, jobject等是由string.h來的
- #include "com_example_androidndktesting3_MainActivity.h"一定要include
另外必須要在Project當下的目錄先產生header檔案(我是把指令寫成bat,另外C:\android-sdk\platforms\android-17\android.jar一定要加,不然會無法編出header):
javah -d jni -classpath bin/classes;C:\android-sdk\platforms\android-17\android.jar com.example.androidndktesting3.MainActivity
pause
若沒有產生header則會發生【No implementation found for native Lcom/example/androidndktesting3/MainActivity;.test ()Ljava/lang/String;】錯誤
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Android程式碼:
public class MainActivity extends Activity {
private TextView tvHello;
static {
System.loadLibrary("MediaNdk");
}
public native String test();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvHello = (TextView) findViewById(R.id.tvHello);
tvHello.setText(test());
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
若是遇到【JNIEnv cannot be resolved】錯誤則在Android Project上【按右鍵】->【Build Project】即可
※由於Android JNI是認header的,因此若日後JNI內有新增新的方法則需要重新用剛剛的bat再產生一次header