原文:http://blog.csdn.net/ggtaas/article/details/26267251
1、 寫本地方法
- // 設置縮放尺寸、旋轉角度
- privatenative void setScale(float scale);
- private nativevoid setAngle(float angle);
2、 使用javah命令生成頭文件。
生成之後會在工程目錄下看到頭文件,需要刷新:
3、 Native層調用本地方法。
經過javah命令之後,會生成對應native層的本地方法,例如:
在中
將方法拷貝到ImageTargets.cpp文件中,實現該方法:
這就完成JNI通信部分。注意變量要自己設定。
4、 使用觸屏事件,將數據傳遞到native層中,即ImageTargets.cpp中的兩個方法。
觸屏當然要在Java層實現啦,在ImageTargets.java中:注意黃色背景部分。
- publicbooleanonTouchEvent(MotionEvent event)
- {
- int pointerCount = event.getPointerCount();
- int action = event.getAction();
- // 單點觸控的情況主要控制模型的旋轉
- if (pointerCount == 1) {
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- first_x= event.getX(0);
- first_y = event.getY(0);
- System.out.println("ACTION_DOWN pointerCount=" + pointerCount);
- break;
- case MotionEvent.ACTION_UP:
- System.out.println("ACTION_UP pointerCount=" + pointerCount);
- break;
- case MotionEvent.ACTION_MOVE:
- System.out.println("ACTION_MOVE pointerCount=" + pointerCount);
- // Toast.makeText(ImageTargets.this,"sdsdsd", Toast.LENGTH_LONG).show();
- float num_x = event.getX()-first_x;
- float num_y = event.getY()-first_y;
- float angle = (float) Math.atan(num_x/num_y);
- <span style="background-color: rgb(255, 255, 102);"> setAngle(angle);// 調用本地方法傳值</span>
- Log.i("SCY", "------->>>"+num_x+":::"+angle);
- break;
- }
- }
- // 兩點觸控的情況主要控制模型的縮放
- if (pointerCount == 2) {
- switch (action&MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN:
- first_x = event.getX(0);
- first_y = event.getY(0);
- System.out.println("ACTION_DOWN pointerCount=" + pointerCount);
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- oldDist = (float) Math.sqrt((event.getX(0) -event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) -event.getY(1)) * (event.getY(0) - event.getY(1)));
- System.out.println("ACTION_UP pointerCount=" + pointerCount);
- break;
- case MotionEvent.ACTION_MOVE:
- System.out.println("ACTION_MOVE pointerCount=" + pointerCount);
- float newDist = (float) Math.sqrt((event.getX(0) -event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) -event.getY(1)) * (event.getY(0) - event.getY(1)));
- float scale= newDist/oldDist;
- if (scale>=1.5f) {
- scale = 1.5f;
- }
- elseif (scale<=0.5f) {
- scale = 0.5f;
- }
- <span style="background-color: rgb(255, 255, 102);"> setScale(scale);//調用本地方法傳值</span>
- Log.i("SCY","--------->>>"+scale);
- break;
- }
- }
- returnsuper.onTouchEvent(event);
- }
5、 Native層OpenGL渲染
Native層獲取從java層傳遞的值之後,需要使用OpenGL命令對模型進行控制,這個就在ImageTargets.cpp的JNIEXPORTvoid JNICALL
Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv*, jobject)方法中:
這三句分別控制模型的平移、旋轉和縮放,傳遞的值在這裏才起作用。
到這裏,所有的都完成了。剩下的就是使用NDK編譯生成so文件,再運行就可以了。
AR研發團隊招募有夢想的年輕人,有興趣可以私信我,最好是在深圳。