Android NDK(JNI) Tricks

  • 2591
  • 0

摘要: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